home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
401_500
/
DISK0435
/
DISK0435.ZIP
/
APINVB.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-05-17
|
5KB
|
178 lines
C*****APINVB
DOUBLE PRECISION FUNCTION APINVB( P, Alpha, Beta )
C
DOUBLE PRECISION P
DOUBLE PRECISION Alpha
DOUBLE PRECISION Beta
C
C Function: APINVB
C
C Purpose: CALCULATES INVERSE Beta DISTRIBUTION
C
C Calling Sequence:
C
C B := APINVB( P, Alpha, Beta )
C
C P --- PROBABILITY FOR WHICH PERCENTAGE
C POINT IS TO BE FOUND (DOUBLE PRECISION,INP
C Alpha --- FIRST PARAMETER OF Beta DISTRIBUTION
C (DOUBLE PRECISION,INPUT)
C Beta --- SECOND PARAMETER OF Beta DISTRIBUTION
C (DOUBLE PRECISION,INPUT)
C
C B --- RESULTING PERCENTAGE POINT OF Beta DIST.
C
C Calls: CDBeta (CUMULATIVE Beta DISTRIBUTION)
C
C Called By: MANY
C
C Remarks:
C
C BECAUSE OF THE RELATIONSHIP BETWEEN THE Beta
C DISTRIBUTION AND THE F DISTRIBUTION, THIS
C ROUTINE CAN BE USED TO FIND THE INVERSE OF
C THE F DISTRIBUTION.
C
C THE PERCENTAGE POINT IS RETURNED AS -1.0
C IF ANY ERROR OCCURS.
C
C THIS ROUTINE USES NEWTONS METHOD
C TO FIND THE PERCENTAGE POINT.
C
C THE ALGORITHM IS BASED UPON AS110
C FROM APPLIED STATISTICS.
C
INTEGER ITER, MAXITR
C
DOUBLE PRECISION EPSZ
C
DOUBLE PRECISION XIM1, XI, XIP1, FIM1, FI, W
DOUBLE PRECISION CMPLBT, ADJ, SQ, R, S, T
DOUBLE PRECISION H, PP, AA, BB, A1, B1
DOUBLE PRECISION G
C
DOUBLE PRECISION ALGama
DOUBLE PRECISION CDBeta
C
DOUBLE PRECISION APINVN
DOUBLE PRECISION PSING
C
DATA EPSZ / 1.0D-26 /
C
DATA MAXITR/ 50 /
C
C (1) CHECK VALIDITY OF PARAMETERS.
C
IF( Alpha <= 0.0 ) GOTO 9005
IF( Beta <= 0.0 ) GOTO 9005
C
IF( ( P > 1.0 ) OR ( P < 0.0 ) ) GOTO 9005
C
C (2) FLIP PARAMETERS SO THAT
C 'P' FOR EVALUATION IS <:= .5
C
IF( P > 0.5 ) GOTO 10
C
AA := Alpha
BB := Beta
PP := P
GOTO 20
C
10 AA := Beta
BB := Alpha
PP := 1.0 - P
C
C (3) GENERATE INITIAL APPROXIMATION.
C SEVERAL DIFFERENT ONES USED, DEPENDING UPON
C VALUES OF (P,Alpha,Beta).
C
20 CMPLBT := ALGama( AA ) + ALGama( BB ) -
1 ALGama( AA + BB )
C
PSING := 1.0 - PP
FI := APINVN( PSING )
C
IF( ( AA > 1.0 ) AND ( BB > 1.0 ) ) GOTO 40
C
R := BB + BB
T := 1.0 / ( 9.0 * BB )
T := R * ( 1.0 - T + FI * SQRT( T ) ) ** 3
C
IF( T > 0.0 ) GOTO 30
C
XI := 1.0 - EXP( ( LOG( ( 1.0 - PP ) * BB )
1 + CMPLBT ) / BB )
GOTO 50
C
30 T := ( 4.0 * AA + R - 2.0 ) / T
C
IF( T <= 1.0 ) XI := EXP( (LOG( PP * AA ) + CMPLBT) / PP)
IF( T > 1.0 ) XI := 1.0 - 2.0 / ( T + 1.0 )
GOTO 50
C
40 R := ( FI * FI - 3.0 ) / 6.0
S := 1.0 / ( AA + AA - 1.0 )
T := 1.0 / ( BB + BB - 1.0 )
H := 2.0 / ( S + T )
W := FI * SQRT( H + R ) / H - ( T - S ) *
1 ( R + 5.0 / 6.0 - 2.0 / ( 3.0 * H ) )
XI := AA / ( AA + BB * EXP( W + W ) )
C
C (4) BEGIN NEWTON-RAPHSON LOOP.
C
50 A1 := 1.0 - AA
B1 := 1.0 - BB
FIM1 := 0.0
SQ := 1.0
XIM1 := 1.0
C
DO 100 ITER := 1 , MAXITR
C
FI := CDBeta( XI, AA, BB )
IF( FI < 0.0 ) GOTO 9005
C
FI := ( FI - PP ) * EXP( CMPLBT + A1 * LOG( XI ) +
1 B1 * LOG( 1.0 - XI ) )
C
IF( ( FI * FIM1 ) <= 0.0 ) XIM1 := SQ
C
G := 1.0
C
60 ADJ := G * FI
SQ := ADJ * ADJ
C
IF( SQ < XIM1 ) GOTO 70
C
G := G / 3.0
GOTO 60
C
70 XIP1 := XI - ADJ
IF( ( XIP1 .GE. 0.0 ) AND
1 ( XIP1 <= 1.0 ) ) GOTO 80
C
G := G / 3.0
GOTO 60
C
80 IF( XIM1 <= EPSZ ) GOTO 9000
IF( FI * FI <= EPSZ ) GOTO 9000
C
IF( ( XIP1 = 0.0 ) OR
1 ( XIP1 = 1.0 ) ) GOTO 70
C
IF( XIP1 = XI ) GOTO 9000
C
XI := XIP1
FIM1 := FI
C
100 CONTINUE
C
9000 APINVB := XI
IF( P > 0.5 ) APINVB := 1.0 - APINVB
C
RETURN
C
9005 XI := -1.0
GOTO 9000
C
END